#include "widget.h"
#include "ui_widget.h"
#include"student.h"
#include"teacher.h"
#include<QPushButton>

// Teacher 类 老师类
//student  类 学生类
// 下课后，老师触发一个信号，学生响应信号，请客吃饭

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个老师的对象
    this->zt=new Teacher(this);

    //创建一个学生的对象
    this->st=new Student(this);

    //老师饿了，学生请客的链接
    //connect(zt,&Teacher::hungry,st,&Student::treat);

    //链接带参数的信号和槽
    //指针->地址
    //函数指针->函数地址
    //当我们使用函数重载的时候必须清楚的界定到底应该选用哪个函数
    //直接使用指向函数的指针调用该函数

    void(Teacher::*teacherSignal)(QString)=&Teacher::hungry;
    void(Student::*studentSlot)(QString)=&Student::treat;
    connect(zt,teacherSignal,st,studentSlot);
    //d调用下课
    //classIsover();
    //这个代码是有顺序的，必须先把他们链接 了，才能完整的触发

    //点击一个下课的按钮再下课
    QPushButton *btn=new QPushButton("xiake",this);
    resize(600,400);
    //点击按钮出发下课
    //connect(btn,&QPushButton::clicked,this,&Widget::classIsover);


    //无参的信号和槽的链接
    void(Teacher::*teacherSignal2)(void)=&Teacher::hungry;
    void(Student::*studentSlot2)(void)=&Student::treat;
    connect(zt,teacherSignal2,st,studentSlot2);

    //信号链接信号
    //这个clicked连接的是一个无参的槽，不报错
    //要是链接有参的就会报错，因为clicked(bool)和QString不匹配
    //但是bool相当于一个参数大于void零个参数所以不报错
    connect(btn,&QPushButton::clicked,zt,teacherSignal2);

    //不但链接信号，还让他关闭窗口
    connect(btn,&QPushButton::clicked,this,&QWidget::close);

    //断开信号
    //disconnect(zt,teacherSignal2,st,studentSlot2);

    //拓展1.信号可以连接信号
    //2.一个信号了可以链接多个信号
    //3.多个信号可以链接同一个槽函数
    //4.信号和槽的类型必须一一对应
    //5.信号和槽的参数个数一样.信号的个数可以多于槽函数，类型一一对应

    //QT4以前的
    //connect(zt,SIGNAL(hungry()),st,SLOT(treat()));
    //4的优点,参数直观，缺点，类型不做检测

//    QPushButton *btn2=new QPushButton;
//    [btn](){
//       btn->setText("aaa");
//       // btn2->setText("aaa");//只允许看见btn 别的看不到
//    }();
//    //=值传递，引用传递&，推荐用值传递;一般等号就够 了。
    //值传递在修改值的时候修改的是拷贝，不修改原来的值mutable

   // int ret=[]()->int{return 1000;}();


    //利用表达式实现点击按钮关闭窗口
    QPushButton *btn3=new QPushButton;
    btn3->setText("close");
    btn3->move(100,0);
    btn3->setParent(this);

    connect(btn3,&QPushButton::clicked,[=](){//第三个参数是this可以省略
        this->close();
       emit zt->hungry("sdddf");//两个槽函数
        btn3->setText("aaa");//三个操作 了
    });

    //open出来一个窗口，再点close就关闭，升级版，一个按钮实现
    //
}
void Widget::classIsover(){
    //下课函数，调用后，触发了老师饿了的信号
    //emit zt->hungry();
    emit zt->hungry("jiding");
}

Widget::~Widget()
{
    delete ui;
}
